{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "7645d12e",
   "metadata": {},
   "source": [
    "<div dir=\"rtl\" align=\"center\">\n",
    "<font face=\"XB Zar\" size=5>\n",
    "    <font face=\"IranNastaliq\" size=5>\n",
    "      به نام خدا\n",
    "    </font>\n",
    "    <br>\n",
    "    <font size=3>\n",
    "      دانشگاه صنعتی شریف - دانشکده مهندسی کامپیوتر\n",
    "    </font>\n",
    "    <br>\n",
    "    <font color=blue size=5>\n",
    "      مقدمه‌ای بر یادگیری ماشین\n",
    "    </font>\n",
    "    <br>\n",
    "    <hr/>\n",
    "    <font color=red size=6>\n",
    "      فصل سوم: یادگیری، ارزیابی و تنطیم کردن مدل ها\n",
    "    </font>\n",
    "    <hr/>\n",
    "    <font color=red size=6>\n",
    "      مبحث:‌ اعتبارسنجی متقابل (Cross Validation)\n",
    "    </font>\n",
    "    <hr/>\n",
    "    <br>\n",
    "      نویسنده:‌ پیمان ناصری\n",
    "    <hr>\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "c6251893",
   "metadata": {},
   "source": [
    "<div dir=rtl id=\"Abstract\">\n",
    "<font face=\"XB Zar\" size=4>\n",
    "  <font color=\"red\" size=6>\n",
    "    هدف\n",
    "  </font>\n",
    "  <hr /> \n",
    "در یادگیری ماشین ، قابلیت تعمیم به توانایی یک الگوریتم در تأثیرگذاری روی ورودی های مختلف اشاره دارد؛ به این معنی که مدل یادگیری ماشین توانایی عملکرد خود را در برابر ورود داده های جدید که در داده های آموزشی نبوده از دست نمی دهد.<br>\n",
    "    برای انسان، عمومیت بخشی و تعمیم، طبیع ترین کار ممکن است. ما می توانیم به صورت آنی (در ذهنمان) دسته بندی و طبقه بندی انجام دهیم. به طور مثال، ما بدون شک یک سگ را تشخیص می دهیم حتی اگر قبل از آن، چنین نژادی را ندیده باشیم. با این حال چنین مساله ای می تواند برای یک مدل یادگیری ماشین کاملا چالش برانگیز باشد. به همین دلیل بررسی توانایی الگوریتم در عمومیت بخشی کار مهمی است که در زمان ساخت مدل نیاز به توجه زیادی دارد.<br>\n",
    "    برای انجام چنین کاری از روش اعتبارسنجی متقابل (CV) استفاده می کنیم.\n",
    "  <br/>\n",
    "</font>\n",
    "</div>"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "0689599a",
   "metadata": {},
   "source": [
    "<div dir=rtl id=\"Abstract\">\n",
    "<font face=\"XB Zar\" size=4>\n",
    "  <font color=\"red\" size=6>\n",
    "    اعتبارسنجی متقابل (Cross Validation)\n",
    "  </font>\n",
    "  <hr />\n",
    "       این روش سعی می‌کند یک تخمین نااریب (unbiased) از generalization error بزند. برای مدل کردن اعتبارسنجی متقابل روش­های متنوع زیادی ممکن است استفاده \n",
    "<br>شود با این­که همه ی آن­ها یک الگوریتم مشابه دارند \n",
    "<p style=\"text-align: justify;\">1- تقسیم کردن مجموعه داده­ها به دو بخش: بخشی برای آموزش و بخش دیگر برای ارزیابی</p>\n",
    "<p style=\"text-align: justify;\">2- مدل را روی مجموعه دادههای آموزشی، آموزش دهید</p>\n",
    "<p style=\"text-align: justify;\">3- اعتبار مدل را رو داده های ارزیابی بدست میاوریم</p>\n",
    "<p style=\"text-align: justify;\">4-مرحله یک تا سه را چندین بار تکرار میکنیم . تعداد تکرار ها بستگی روشی دارد که ما برای CVمورد استفاده قرار میدهیم .</p>\n",
    "\n",
    "\n",
    "</font>\n",
    "</div>"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7b1541b7",
   "metadata": {},
   "source": [
    "<div dir=rtl id=\"Abstract\">\n",
    "<font face=\"XB Zar\" size=4>\n",
    "  <font color=\"red\" size=6>\n",
    "    انواع روش‌های اعتبارسنجی \n",
    "  </font>\n",
    "  <hr />\n",
    "<font face=\"XB Zar\" size=4><div dir=rtl>\n",
    "<font color=\"red\" size=\"5\">Holdout Validation</font>\n",
    "<img src=\"resources/HoldoutـValidation.png\" width=\"800\">\n",
    "<br>\n",
    "در این روش، داده‌ها به دو دسته train و test تقسیم می‌شوند. این تقسیم می‌تواند به صورت 40/60 ، 30/70 یا 20/80 باشد. بنابراین مدل مورد نظر روی داده‌های train آموزش دیده و روی داده‌های test مورد ارزیابی قرار می‌گیرد.معمولا از روش اعتبارسنجی Hold-out برای مجموعه داده­های بزرگ استفاده می­کنیم زیرا تنها به یک بار آموزش مدل نیاز دارد.البته روش Hold-out یک ایراد اساسی دارد. برای مثال، مجموعه داده­ای که توزیع کاملا یکنواختی ندارد. در چنین حالتی ممکن است پس از تقسیم، در یک نقطه­ی نقطه­ی ناهموار قرار بگیریم. به­طور مثال مجموعه­ی آموزشی، مجموعه تست را نشان نخواهد داد. ممکن است مجموعه آموزشی و تست تفاوت بسیاری داشته باشند، ممکن است یکی از آن­ها سخت­تر یا آسان­تر باشد.\n",
    "به­علاوه این واقعیت که ما مدلمان را فقط یک بار تست می­کنیم ممکن است یک تنگنا برای این روش باشد. به دلایلی که اشاره شد، ممکن است نتایج به­دست آمده به روش Hold-out نادرست به نظر برسد.\n",
    "<br><br>\n",
    "<br><br>\n",
    "<font color=\"red\" size=\"5\">LOOCV (Leave One Out Cross Validation)</font>\n",
    "<img src=\"resources/loocv2.png\" width=\"800\">\n",
    "<br>\n",
    "در این تکنیک، از تمامی داده‌ها به جز یک داده برای آموزش و از داده باقی مانده برای تست مدل استفاده می‌شود. این فرآیند N بار تکرار می‌شود که N تعداد داده‌ها را نشان می‌دهد. مزیت این روش این است که از تمامی داده‌ها برای آموزش و تست مدل استفاده خواهد شد. البته از نظر محاسباتی روش پر هزینه‌ای است چراکه زمان زیادی برای اعتبارسنجی متقابل مدل با استفاده از LOOCV نیاز است.\n",
    "<br><br>  \n",
    "<br><br>  \n",
    "<font color=\"red\" size=\"5\">K-Fold Cross Validation</font> \n",
    "<img src=\"resources/K-Fold_Cross_Validation.png\" width=\"800\">\n",
    "<br>\n",
    "ابتدا، داده ها را shuffle می کنیم و به تعداد k نمونه در می آوریم. مهم است که همه سایز یکسانی داشته باشند و k کمتر یا مساوی تعداد عناصر در داده باشد.\n",
    "در iteration اول، نمونه ی اول به عنوان داده ی تست استفاده می شود و از بقیه بخش ها، به عنوان داده ی آموزش استفاده می کنیم.\n",
    "مدل را آموزش می دهیم و با بخش تست، آن را ارزیابی می کنیم. مقدار خطا و مقدار امتیاز این بخش را ثبت می کنیم.\n",
    "در iteration بعدی، یک زیرمجموعه ی دیگر را به عنوان داده ی تست انتخاب می کنیم و بقیه را داده ی آموزش در نظر می گیریم.\n",
    "مدل را بر روی داده ی جدید آموزش داده و تست می کنیم و باز هم امتیاز و خطارا ثبت می کنیم.\n",
    "    آنقدر ادامه می دهیم که تعداد iterationها به k رسیده باشد و همه ی بخش های داده، به عنوان داده ی تست امتحان شده باشند. در نهایت به تعداد k مقدار امتیاز و خطا داریم.\n",
    "    خطای کلی برابر میانگین مقادیر به دست آمده می باشد.\n",
    " \n",
    "</div> <br><br>"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.10.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
